package javase_class_250904;

/**
 * ClassName: Test1
 * Package: javase_class_250904
 * Description:
 *
 * @Author harkjeans
 * @Create 2025/9/4 19:24
 * @Version 1.0
 */
/**
 * 1. toString()方法
 * 作用：返回该对象的字符串表示。它通常用于日志打印、调试等场景，让我们能以可读的形式“看”到一个对象的内容。
 * Object默认实现：getClass().getName() + '@' + Integer.toHexString(hashCode())
 * 格式：类名@哈希码的十六进制表示（如 com.example.Student@1b6d3586）
 * 为什么要重写（Override）：默认的toString()返回值没有实际意义，无法体现对象的关键属性值。强烈建议为你自己定义的每个类重写此方法。
 *
 *2. equals(Object obj)方法
 * 作用：指示其他某个对象是否与此对象“相等”。用于比较两个对象的内容是否逻辑上相同。
 * Object默认实现：return (this == obj);
 * 它使用的是==操作符，即只比较两个引用是否指向内存中的同一个对象（判断是否是同一个对象）。
 * 为什么要重写：我们通常需要的是“逻辑相等”。例如，两个不同的Student对象，如果他们的id相同，我们就认为他们是同一个学生。默认实现无法满足这个需求。
 * 重写步骤（经典五步法）：
 * 检查是否自比较 (if (this == obj) return true;)
 * 检查传入对象是否为null (if (obj == null) return false;)
 * 检查类型是否相同 (if (getClass() != obj.getClass()) return false;)
 * 注意：也可以用 instanceof，但getClass()判断更严格，不会匹配子类。
 * 将传入对象转换为当前类型
 * 开始比较各个关键字段（field）是否相等
 *
 * equals与==的区别：
 * ==：是操作符。比较基本数据类型时，比较的是值；比较引用类型时，比较的是内存地址。
 * equals()：是方法。默认行为同==，但重写后用于比较对象的内容。
 */
public class Test1 {
    public static void main(String[] args) {
        User u1 = new User("VIP", "hark", "abc123");
        System.out.println(u1);
        User u2 = new User("VIP", "hark", "abc123");
        System.out.println(u1.equals(u2));//ture
        System.out.println(u1 == u2);//false
    }

}
class User{
    private String host;
    private String username;
    private String password;
    public User(String host, String username, String password) {
        super();
        this.host = host;
        this.username = username;
        this.password = password;
    }
    public User() {
        super();
    }
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [host=" + host + ", username=" + username + ", password=" + password + "]";
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (host == null) {
            if (other.host != null)
                return false;
        } else if (!host.equals(other.host))
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        if (username == null) {
            if (other.username != null)
                return false;
        } else if (!username.equals(other.username))
            return false;
        return true;
    }

}